import java.util.HashMap;
import java.util.Map;

/*
 * @Author: aponder
 * @Date: 2020-05-21 08:49:28
 * @LastEditTime: 2020-05-21 09:19:16
 * @LastEditors: aponder
 * @Description: 
 * @FilePath: /leetcode-zh/easy/509.斐波那契数/Solution.java
 */ 
/*
 * @lc app=leetcode.cn id=509 lang=java
 *
 * [509] 斐波那契数
 *
 * https://leetcode-cn.com/problems/fibonacci-number/description/
 *
 * algorithms
 * Easy (66.54%)
 * Likes:    118
 * Dislikes: 0
 * Total Accepted:    52.9K
 * Total Submissions: 79.2K
 * Testcase Example:  '2'
 *
 * 斐波那契数，通常用 F(n) 表示，形成的序列称为斐波那契数列。该数列由 0 和 1 开始，后面的每一项数字都是前面两项数字的和。也就是：
 * 
 * F(0) = 0,   F(1) = 1
 * F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
 * 
 * 
 * 给定 N，计算 F(N)。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 输入：2
 * 输出：1
 * 解释：F(2) = F(1) + F(0) = 1 + 0 = 1.
 * 
 * 
 * 示例 2：
 * 
 * 输入：3
 * 输出：2
 * 解释：F(3) = F(2) + F(1) = 1 + 1 = 2.
 * 
 * 
 * 示例 3：
 * 
 * 输入：4
 * 输出：3
 * 解释：F(4) = F(3) + F(2) = 2 + 1 = 3.
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 0 ≤ N ≤ 30
 * 
 * 
 */

// @lc code=start
class Solution {
    Map<Integer, Integer> note = new HashMap<Integer, Integer>(){{
        put(0, 0);
        put(1, 1);
        // put(2, 1);
        // put(3, 2);
    }};
    public int fib(int N) {
        Integer val = note.get(N);
        if (val == null) {            
            int n2 = fib(N - 2);
            int n1 = fib(N - 1);
            
            val = n1 + n2;
            note.put(N, val);
        }
        
        // System.out.println("F("+N+")="+val);
        return val;
    }
    public static void main(String[] args) {
        new Solution().fib(5);
    }
}
// @lc code=end

// Accepted
// 31/31 cases passed (8 ms)
// Your runtime beats 31.06 % of java submissions
// Your memory usage beats 5.26 % of java submissions (36.1 MB)

// Accepted
// 31/31 cases passed (1 ms)
// Your runtime beats 33.05 % of java submissions
// Your memory usage beats 5.26 % of java submissions (36.5 MB)